home *** CD-ROM | disk | FTP | other *** search
/ CD Concept 6 / CD Concept 06.iso / mac / UTILITAIRE / Universal TCL 1.1.3 v3.1 / Pointer TCL 3.1 / new source / MetaInfo.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-27  |  2.6 KB  |  106 lines  |  [TEXT/MPCC]

  1. #ifndef __METAINFO__
  2. #define __METAINFO__
  3.  
  4. #include <stddef.h>
  5.  
  6. #include <Types.h>
  7.  
  8. class MetaInfo {
  9.  
  10.     static int sNumClasses;
  11.     static MetaInfo * g_head_info;
  12.     MetaInfo *next;
  13.  
  14.     MetaInfo *ancestor1;
  15.     MetaInfo *ancestor2;
  16.     MetaInfo *ancestor3;
  17.     MetaInfo *ancestor4;
  18.     void *(*new_func)(void);
  19.  
  20. public :
  21.  
  22.     const char *name;
  23.     size_t size;
  24.  
  25.     MetaInfo (const char *nam, size_t siz, void*(*new_fun)(void),
  26.                MetaInfo *ancesto1 = NULL, MetaInfo *ancesto2 = NULL,
  27.                MetaInfo *ancesto3 = NULL, MetaInfo *ancesto4 = NULL)
  28.     {
  29.         name = nam; size = siz; new_func = new_fun; ancestor1 = ancesto1;
  30.         ancestor2 = ancesto2; ancestor3 = ancesto3; ancestor4 = ancesto4;
  31.         next = g_head_info; g_head_info = this;
  32.         sNumClasses++;
  33.     }
  34.  
  35.     static void *NewByName(const char *str);
  36.  
  37.     static Boolean Member(MetaInfo *o, MetaInfo *c);
  38.  
  39.     static Boolean ClassExists(const char *name);
  40. };
  41.  
  42.  
  43. #define class_name(o) ((o)->_getClassInfo()->name)
  44.  
  45. #define member(o,c) (MetaInfo::Member((o)->_getClassInfo(), &c::_classInfo))
  46.  
  47. #define new_by_name(n) (MetaInfo::NewByName(n))
  48.  
  49. #define class_exists(c) (MetaInfo::ClassExists(c))
  50.  
  51. #define TCL_DECLARE_CLASS \
  52. public : \
  53.     static MetaInfo _classInfo ; \
  54.     virtual MetaInfo * _getClassInfo ( ) ; \
  55.     static void * _new ( void ) ; \
  56. private :
  57.  
  58.  
  59. #define TCL_DEFINE_CLASS(c) \
  60.     MetaInfo * c :: _getClassInfo ( void ) { return & c :: _classInfo ; } \
  61.     void * c :: _new ( void ) { return new c ( ) ; }
  62.  
  63.  
  64. #define TCL_DEFINE_CLASS_D0(c) \
  65.     TCL_DEFINE_CLASS(c) \
  66.     MetaInfo c :: _classInfo ( #c , sizeof ( c ) , c :: _new )
  67.  
  68.  
  69. #define TCL_DEFINE_CLASS_D1(c,a) \
  70.     TCL_DEFINE_CLASS(c) \
  71.     extern MetaInfo a :: _classInfo ; \
  72.     MetaInfo c::_classInfo ( #c , sizeof ( c ) , c :: _new , \
  73.                              & a :: _classInfo )
  74.  
  75.  
  76. #define TCL_DEFINE_CLASS_D2(c,a1,a2) \
  77.     TCL_DEFINE_CLASS(c) \
  78.     extern MetaInfo a1 :: _classInfo ; \
  79.     extern MetaInfo a2 :: _classInfo ; \
  80.     MetaInfo c::_classInfo ( #c , sizeof ( c ) , c :: _new , \
  81.                              & a1 :: _classInfo , & a2 :: _classInfo )
  82.  
  83.  
  84. #define TCL_DEFINE_CLASS_D3(c,a1,a2,a3) \
  85.     TCL_DEFINE_CLASS(c) \
  86.     extern MetaInfo a1 :: _classInfo ; \
  87.     extern MetaInfo a2 :: _classInfo ; \
  88.     extern MetaInfo a3 :: _classInfo ; \
  89.     MetaInfo c::_classInfo ( #c , sizeof ( c ) , c :: _new , \
  90.                              & a1 :: _classInfo , & a2 :: _classInfo , \
  91.                              & a3 :: _classInfo )
  92.  
  93.  
  94. #define TCL_DEFINE_CLASS_D4(c,a1,a2,a3,a4) \
  95.     TCL_DEFINE_CLASS(c) \
  96.     extern MetaInfo a1 :: _classInfo ; \
  97.     extern MetaInfo a2 :: _classInfo ; \
  98.     extern MetaInfo a3 :: _classInfo ; \
  99.     extern MetaInfo a4 :: _classInfo ; \
  100.     MetaInfo c::_classInfo ( #c , sizeof ( c ) , c :: _new , \
  101.                              & a1 :: _classInfo , & a2 :: _classInfo , \
  102.                              & a3 :: _classInfo , & a4 :: _classInfo )
  103.  
  104. #endif /* __METAINFO__ */
  105.  
  106.